#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=22;
/*
4
1 10 3 1
1 1 0
0 1
1
*/ 
vector<int> edges[N];
LL val[N];
int n;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&val[i]);
    }
    int t;
    int in[N];
    memset(in,0,sizeof(in));
    for(int i=1;i<=n-1;i++){
        for(int j=i+1;j<=n;j++){
            scanf("%d",&t);
            if(t==1){
                in[j]++;
                edges[i].emplace_back(j);
            }
        }
    }
    queue<int> que;
    LL sum[N];
    memset(sum,0,sizeof(sum));
    vector<int> rou[N];
    for(int i=1;i<=n;i++){
        if(in[i]==0) {
            que.push(i);
            sum[i]=val[i];
            rou[i].emplace_back(i);
        }
    }
    //
    while (!que.empty()){
    	int size=que.size();
    	for(int i=0;i<size;i++){
	        int s=que.front();
	        que.pop();
	        for(auto u:edges[s]){
	            --in[u];
	           	if(sum[s]+val[u]>sum[u]){
					rou[u]=rou[s];
	               	rou[u].emplace_back(u);
	               	sum[u]=sum[s]+val[u];					
				} 
	            if(in[u]==0){
	                que.push(u);
	            }
	        }    		
		}
    }
    vector<int> ansr;
    LL maxn=0;
    for(int i=1;i<=n;i++){
        if(sum[i]>=maxn){
            maxn=sum[i];
            ansr=rou[i];
        }
    }
    for(auto i:ansr){
        printf("%d ",i);
    }
    printf("\n%lld",maxn);
    return 0;
}
